package com.sum.common.inter;

import com.sum.common.bean.ReadMode;
import com.sum.common.bean.ReaderExt;
import com.sum.common.bean.TagInfo;
import com.sum.common.bean.WriteParams;

import java.util.List;
import java.util.Map;

/**
 * UHF设备管理接口
 */
public interface IUHFManager {
    /**
     * 获取实例
     */
    IUHFManager getInstance();

    /**
     * 连接设备
     * @param port 端口
     * @param baudRate 波特率，默认115200
     * @return 连接是否成功
     */
    boolean connect(String port, int baudRate);

    /**
     * 检查是否已连接
     */
    boolean isConnected();

    /**
     * 获取硬件参数
     */
    String getHardware();

    /**
     * 获取最新的详细错误信息
     */
    ReaderExt.READER_ERR getLastDetailError(ReaderExt.ErrInfo info);

    /**
     * 多标签模式开始盘点EPC
     * @param readMode 读取模式，默认NORMAL
     */
    ReaderExt.READER_ERR asyncStartReading(ReadMode readMode);

    /**
     * 清除标签列表
     */
    void clearTagList();

    /**
     * 设置盘点监听器
     */
    void setOnInventoryListener(OnInventoryListener listener);

    /**
     * 多标签模式停止盘点EPC
     */
    ReaderExt.READER_ERR asyncStopReading();

    /**
     * 设置盘点过滤
     * @param fdata 过滤的数据
     * @param fbank 过滤数据的区域 1:EPC区,2:TID区,3:USER区
     * @param fstartaddr 数据开始地址，单位word
     * @param matching 是否匹配，true:盘点与过滤数据相匹配的标签,false:盘点与过滤数据不相匹配的标签
     */
    boolean setInventoryFilter(byte[] fdata, int fbank, int fstartaddr, boolean matching);

    /**
     * 取消盘点过滤
     */
    boolean setCancleInventoryFilter();

    /**
     * 实时获取EPC
     * 荣睿/国芯通过回调返回,新联是直接返回
     */
    List<TagInfo> tagInventoryRealTime();

    /**
     * 停止盘点
     */
    boolean stopTagInventory();

    /**
     * 定时获取EPC
     * @param readtime 单次盘点的时间，单位：毫秒
     */
    List<TagInfo> tagInventoryByTimer(short readtime);

    /**
     * 设置盘点参数
     */
    boolean setInventoryParameter(Map<String, Object> params);

    /**
     * 获取盘点参数
     */
    String getInventoryParameter();

    /**
     * 读标签数据
     */
    ReaderExt.READER_ERR getTagData(int region, int startaddr, int len, byte[] rdata,
                                    byte[] password, short timeout);

    /**
     * 指定标签读数据
     */
    byte[] getTagDataByFilter(int mbank, int startaddr, int len, byte[] password,
                              short timeout, byte[] fdata, int fbank, int fstartaddr, boolean matching);

    /**
     * 写标签数据
     */
    ReaderExt.READER_ERR writeTagData(WriteParams writeParams, int regoin, int startaddress, String oldData, byte[] data,
                                      int datalen, byte[] accesspasswd, short timeout);

    /**
     * 指定标签写数据
     */
    ReaderExt.READER_ERR writeTagDataByFilter(char mbank, int startaddress, byte[] data,
                                              int datalen, byte[] accesspasswd, short timeout,
                                              byte[] fdata, int fbank, int fstartaddr, boolean matching);

    /**
     * 写EPC
     */
    ReaderExt.READER_ERR writeTagEPC(byte[] data, byte[] accesspwd, short timeout);

    /**
     * 指定标签写EPC
     */
    ReaderExt.READER_ERR writeTagEPCByFilter(byte[] data, byte[] accesspwd, short timeout,
                                             byte[] fdata, int fbank, int fstartaddr, boolean matching);

    /**
     * 锁标签
     */
    ReaderExt.READER_ERR lockTag(ReaderExt.Lock_Obj lockobject, ReaderExt.Lock_Type locktype,
                                 byte[] accesspasswd, int timeout);

    /**
     * 锁指定标签
     */
    ReaderExt.READER_ERR lockTagByFilter(ReaderExt.Lock_Obj lockobject, ReaderExt.Lock_Type locktype,
                                         byte[] accesspasswd, short timeout,
                                         byte[] fdata, int fbank, int fstartaddr, boolean matching);

    /**
     * 摧毁标签
     */
    ReaderExt.READER_ERR killTag(byte[] killpasswd, int timeout);

    /**
     * 摧毁指定标签
     */
    ReaderExt.READER_ERR killTagByFilter(byte[] killpasswd, int timeout,
                                         byte[] fdata, int fbank, int fstartaddr, boolean matching);

    /**
     * 设置频段区域
     */
    ReaderExt.READER_ERR setRegion(int region);

    /**
     * 获取频段区域
     */
    ReaderExt.Region_Conf getRegion();

    /**
     * 设置单标签模式
     */
    void setSingleLabelMode(boolean enabled);

    /**
     * 设置分组TID模式
     */
    void setGroupTidMode(boolean enabled);

    /**
     * 获取频点
     */
    int[] getFrequencyPoints();

    /**
     * 设置频点
     */
    ReaderExt.READER_ERR setFrequencyPoints(int[] frequencyPoints);

    /**
     * 设置功率
     */
    ReaderExt.READER_ERR setPower(int power);

    /**
     * 获取功率
     */
    int[] getPower();

    /**
     * 设置快速模式
     */
    ReaderExt.READER_ERR setFastMode();

    /**
     * 获取协议
     */
    int getProtocol();

    /**
     * 设置协议
     */
    ReaderExt.READER_ERR setProtocol(String protocol);

    /**
     * 获取Q值
     */
    int getQValue();

    /**
     * 设置Q值
     */
    ReaderExt.READER_ERR setQValue(int selectedPosition);

    /**
     * 获取温度
     */
    int getTemperature();

    /**
     * 获取Session
     */
    String getSession();

    /**
     * 获取Flag
     */
    String getFlag();

    /**
     * 关闭连接
     */
    boolean close();
}